<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Class: AppsForYourDomain::Connection</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
  <script type="text/javascript">
  // <![CDATA[

  function popupCode( url ) {
    window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
  }

  function toggleCode( id ) {
    if ( document.getElementById )
      elem = document.getElementById( id );
    else if ( document.all )
      elem = eval( "document.all." + id );
    else
      return false;

    elemStyle = elem.style;
    
    if ( elemStyle.display != "block" ) {
      elemStyle.display = "block"
    } else {
      elemStyle.display = "none"
    }

    return true;
  }
  
  // Make codeblocks hidden by default
  document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
  
  // ]]>
  </script>

</head>
<body>



    <div id="classHeader">
        <table class="header-table">
        <tr class="top-aligned-row">
          <td><strong>Class</strong></td>
          <td class="class-name-in-header">AppsForYourDomain::Connection</td>
        </tr>
        <tr class="top-aligned-row">
            <td><strong>In:</strong></td>
            <td>
                <a href="../../files/appsforyourdomain/connection_rb.html">
                appsforyourdomain/connection.rb
                </a>
        <br />
            </td>
        </tr>

        <tr class="top-aligned-row">
            <td><strong>Parent:</strong></td>
            <td>
                Object
            </td>
        </tr>
        </table>
    </div>
  <!-- banner header -->

  <div id="bodyContent">



  <div id="contextContent">

    <div id="description">
      <p>
Implements Persistent Connections to Google
</p>
<p>
This class provides built-in support for higher-performing persistent
http/https connections to <a
href="http://www.google.com">www.google.com</a>. It supports most all HTTP
methods (GET, POST, PUT, DELETE, SEARCH, PROPFIND, etc). It also provides
easy framework for authenticating with <a
href="http://code.google.com/apis/accounts/AuthForInstalledApps.html">Google-Client-Login-API</a>.
</p>

    </div>


   </div>

    <div id="method-list">
      <h3 class="section-bar">Methods</h3>

      <div class="name-list">
      <a href="#M000021">clientLogin</a>&nbsp;&nbsp;
      <a href="#M000017">connect</a>&nbsp;&nbsp;
      <a href="#M000020">encode_params</a>&nbsp;&nbsp;
      <a href="#M000019">exec</a>&nbsp;&nbsp;
      <a href="#M000016">new</a>&nbsp;&nbsp;
      <a href="#M000018">perform</a>&nbsp;&nbsp;
      </div>
    </div>

  </div>


    <!-- if includes -->

    <div id="section">


    <div id="constants-list">
      <h3 class="section-bar">Constants</h3>

      <div class="name-list">
        <table summary="Constants">
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">GOOGLE_URL</td>
          <td>=</td>
          <td class="context-item-value">'https://www.google.com'</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">AUTH_PATH</td>
          <td>=</td>
          <td class="context-item-value">'/accounts/ClientAuth'</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">LOGIN_PATH</td>
          <td>=</td>
          <td class="context-item-value">'/accounts/ClientLogin'</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">DEFAULT_CONTENT_TYPE</td>
          <td>=</td>
          <td class="context-item-value">'application/x-www-form-urlencoded'</td>
        </tr>
        </table>
      </div>
    </div>



    <div id="attribute-list">
      <h3 class="section-bar">Attributes</h3>

      <div class="name-list">
        <table>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">authorization</td>
          <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
          <td class="context-item-desc">
set Authorization header

</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">connection</td>
          <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
          <td class="context-item-desc">
the underlying ruby http(s) connection

</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">max_redirects</td>
          <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
          <td class="context-item-desc">
follow HTTP redirections up to a max. Default is 10

</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">user_agent</td>
          <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
          <td class="context-item-desc">
Override User-Agent sent to web server

</td>
        </tr>
        </table>
      </div>
    </div>
      


    <!-- if method_list -->
    <div id="methods">
      <h3 class="section-bar">Public Class methods</h3>

      <div id="method-M000020" class="method-detail">
        <a name="M000020"></a>

        <div class="method-heading">
          <a href="#M000020" class="method-signature">
          <span class="method-name">encode_params</span><span class="method-args">(hash)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Converts parameters to x-www-form-urlencoded suitable for GET/PUT.
</p>
<p>
Some versions of net/http.rb do not supply this.
</p>
<p>
Args:
</p>
<ul>
<li>hash: such as { &#8216;q&#8217;=&gt; &#8216;ruby doc&#8217;,
&#8216;count&#8217; =&gt; &#8216;15&#8217; }

</li>
</ul>
<p>
Returns: String of http encoded params such as
</p>
<pre>
  q=ruby+doc&amp;count=15
</pre>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000020-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000020-source">
<pre>
<span class="ruby-comment cmt"># File appsforyourdomain/connection.rb, line 172</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">encode_params</span>(<span class="ruby-identifier">hash</span>)
      <span class="ruby-identifier">encoded</span> = <span class="ruby-value str">&quot;&quot;</span>
      <span class="ruby-identifier">hash</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
        <span class="ruby-identifier">encoded</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{k}=&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-constant">URI</span>.<span class="ruby-identifier">escape</span>(<span class="ruby-identifier">v</span>) <span class="ruby-operator">+</span> <span class="ruby-value str">'&amp;'</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">v</span>
      <span class="ruby-keyword kw">end</span>
      <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">encoded</span>.<span class="ruby-identifier">chop</span> <span class="ruby-comment cmt"># remove superfluous &amp;</span>
    <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000016" class="method-detail">
        <a name="M000016"></a>

        <div class="method-heading">
          <a href="#M000016" class="method-signature">
          <span class="method-name">new</span><span class="method-args">(url = GOOGLE_URL)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Establishes an SSL (or plain http) connection to a host that can be cached
for multiple http transactions
</p>
<p>
Args:
</p>
<ul>
<li>url: string - pass nil to suppress connecting

</li>
</ul>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000016-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000016-source">
<pre>
<span class="ruby-comment cmt"># File appsforyourdomain/connection.rb, line 53</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">url</span> = <span class="ruby-constant">GOOGLE_URL</span>)

      <span class="ruby-ivar">@user_agent</span>    = <span class="ruby-value str">&quot;Ruby-GoogleConnection/0.2&quot;</span>
      <span class="ruby-ivar">@max_redirects</span> = <span class="ruby-value">10</span>
      <span class="ruby-ivar">@connection</span>    = <span class="ruby-identifier">connect</span>(<span class="ruby-identifier">url</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">url</span>
    <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <h3 class="section-bar">Public Instance methods</h3>

      <div id="method-M000021" class="method-detail">
        <a name="M000021"></a>

        <div class="method-heading">
          <a href="#M000021" class="method-signature">
          <span class="method-name">clientLogin</span><span class="method-args">(params, backend = GOOGLE_URL + LOGIN_PATH )</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Performs Client Login API
</p>
<p>
Args
</p>
<ul>
<li>params: hash of options

<pre>
        Email:        User's full email address. (including domain)
        Passwd:       User's password.
        accountType:  'HOSTED' or 'GOOGLE' or 'HOSTED_OR_GOOGLE' or nil
        service:      Google service requested
        source:       &quot;companyName-applicationName-versionID&quot;
        logintoken:   optional
        logincaptcha: optional
</pre>
</li>
<li>backend: Login URL to connect to (normally not needed)

</li>
</ul>
<p>
Returns Hash of Authentication tokens to be used on subsequent transactions
</p>
<p>
Raises exceptions depending on the response of the Auth server.
</p>
<p>
See also <a
href="http://code.google.com/apis/accounts/AuthForInstalledApps.html">code.google.com/apis/accounts/AuthForInstalledApps.html</a>
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000021-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000021-source">
<pre>
<span class="ruby-comment cmt"># File appsforyourdomain/connection.rb, line 221</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">clientLogin</span>(<span class="ruby-identifier">params</span>, <span class="ruby-identifier">backend</span> = <span class="ruby-constant">GOOGLE_URL</span> <span class="ruby-operator">+</span> <span class="ruby-constant">LOGIN_PATH</span> )
      <span class="ruby-identifier">postbody</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">encode_params</span>(<span class="ruby-identifier">params</span>)
      <span class="ruby-keyword kw">begin</span>
        <span class="ruby-identifier">resp</span> = <span class="ruby-identifier">perform</span> <span class="ruby-value str">&quot;POST&quot;</span>, <span class="ruby-identifier">backend</span>, <span class="ruby-identifier">postbody</span>, <span class="ruby-constant">DEFAULT_CONTENT_TYPE</span> 
        <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">split_pairs</span>(<span class="ruby-identifier">resp</span>.<span class="ruby-identifier">body</span>)
      <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">exception</span>
        <span class="ruby-identifier">raise</span> <span class="ruby-identifier">exception</span>, <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">response</span>.<span class="ruby-identifier">body</span>, <span class="ruby-identifier">caller</span>
      <span class="ruby-keyword kw">end</span>
    <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000017" class="method-detail">
        <a name="M000017"></a>

        <div class="method-heading">
          <a href="#M000017" class="method-signature">
          <span class="method-name">connect</span><span class="method-args">(url)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Force connect/reconnect after initialization
</p>
<p>
Args:
</p>
<ul>
<li>url: string

</li>
</ul>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000017-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000017-source">
<pre>
<span class="ruby-comment cmt"># File appsforyourdomain/connection.rb, line 65</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">connect</span>(<span class="ruby-identifier">url</span>)
      <span class="ruby-identifier">uri</span>                    = <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">url</span>)
      <span class="ruby-identifier">conn</span>                   = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">uri</span>.<span class="ruby-identifier">host</span>, <span class="ruby-identifier">uri</span>.<span class="ruby-identifier">port</span>)
      <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">set_debug_output</span> <span class="ruby-identifier">$stderr</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">$DEBUG</span>
      <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">uri</span>.<span class="ruby-identifier">scheme</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'https'</span>
        <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">ca_file</span>         = <span class="ruby-keyword kw">__FILE__</span> <span class="ruby-comment cmt"># certs embedded at end of this file</span>
        <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">verify_mode</span>     = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">VERIFY_PEER</span>
        <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">use_ssl</span>         = <span class="ruby-keyword kw">true</span>
      <span class="ruby-keyword kw">end</span>
      <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">start</span>             <span class="ruby-comment cmt"># open up connection</span>
      <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">conn</span>
    <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000019" class="method-detail">
        <a name="M000019"></a>

        <div class="method-heading">
          <span class="method-name">exec</span><span class="method-args">(method, url, body = nil, content_type = DEFAULT_CONTENT_TYPE)</span>
        </div>
      
        <div class="method-description">
          <p>
Alias for <a href="Connection.html#M000018">perform</a>
</p>
        </div>
      </div>

      <div id="method-M000018" class="method-detail">
        <a name="M000018"></a>

        <div class="method-heading">
          <a href="#M000018" class="method-signature">
          <span class="method-name">perform</span><span class="method-args">(method, url, body = nil, content_type = DEFAULT_CONTENT_TYPE)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Performs a GET/PUT/POST/DELETE on the persistent connection. Follows
redirections.
</p>
<p>
Args:
</p>
<ul>
<li>method: string such as &quot;POST&quot;

</li>
<li>url: string to send

</li>
<li>body: string to send

</li>
<li>content_type: string mimetype to send

</li>
</ul>
<p>
Returns: Net::HTTPResponse object.
</p>
<p>
Raises: Raises Net::HTTPException on HTTP failures.
</p>
<p>
To suppress exceptions and glean the response object anyway, use the
following:
</p>
<pre>
  begin
    resp = perform(...)
  rescue =&gt; exception
    p exception.response.body
  end
</pre>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000018-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000018-source">
<pre>
<span class="ruby-comment cmt"># File appsforyourdomain/connection.rb, line 102</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">perform</span>(<span class="ruby-identifier">method</span>, <span class="ruby-identifier">url</span>, <span class="ruby-identifier">body</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">content_type</span> = <span class="ruby-constant">DEFAULT_CONTENT_TYPE</span>)
      <span class="ruby-value">1</span>.<span class="ruby-identifier">upto</span>(<span class="ruby-identifier">max_redirects</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">count</span><span class="ruby-operator">|</span>
        <span class="ruby-identifier">uri</span>  = <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">url</span>)
        <span class="ruby-identifier">path</span> = <span class="ruby-identifier">uri</span>.<span class="ruby-identifier">request_uri</span>
     
        <span class="ruby-comment cmt"># some firewalls only allow GET/POST </span>
        <span class="ruby-identifier">fakemethod</span> = <span class="ruby-identifier">method</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">method</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">'GET'</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">method</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">'POST'</span>
          <span class="ruby-identifier">fakemethod</span> = <span class="ruby-value str">&quot;POST&quot;</span>
        <span class="ruby-keyword kw">end</span> 

        <span class="ruby-identifier">req</span>  = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTPGenericRequest</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">fakemethod</span>, <span class="ruby-operator">!</span><span class="ruby-identifier">body</span>.<span class="ruby-identifier">nil?</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">path</span>)
        <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Authorization'</span>]    = <span class="ruby-identifier">authorization</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">authorization</span>
        <span class="ruby-identifier">req</span>[<span class="ruby-value str">'User-Agent'</span>]       = <span class="ruby-identifier">user_agent</span>

        <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Connection'</span>]       = <span class="ruby-value str">'Keep-alive'</span>
        <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Host'</span>]             = <span class="ruby-identifier">uri</span>.<span class="ruby-identifier">host</span>
   
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>
          <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Content-Type'</span>]   = <span class="ruby-identifier">content_type</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">content_type</span>
          <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Content-Length'</span>] = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">length</span>.<span class="ruby-identifier">to_s</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># reveal real method to Google</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">method</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">fakemethod</span>
          <span class="ruby-identifier">req</span>[<span class="ruby-value str">'Content-Length'</span>] = <span class="ruby-value str">'0'</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>.<span class="ruby-identifier">nil?</span>
          <span class="ruby-identifier">req</span>[<span class="ruby-value str">'X-HTTP-Method-Override'</span>] = <span class="ruby-identifier">method</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># send request, receive response</span>
        <span class="ruby-identifier">resp</span> = <span class="ruby-keyword kw">nil</span>
        <span class="ruby-keyword kw">begin</span> 
          <span class="ruby-identifier">resp</span>        = <span class="ruby-identifier">connection</span>.<span class="ruby-identifier">request</span>(<span class="ruby-identifier">req</span>,<span class="ruby-identifier">body</span>)
        <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">EOFError</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPIPE</span>
          <span class="ruby-comment cmt"># persistent connection torn down by server</span>
          <span class="ruby-ivar">@connection</span> = <span class="ruby-identifier">connect</span>(<span class="ruby-identifier">url</span>)                 <span class="ruby-comment cmt"># reconnect</span>
          <span class="ruby-keyword kw">next</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># handle response</span>
        <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">resp</span>
          <span class="ruby-keyword kw">when</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTPSuccess</span><span class="ruby-operator">:</span>       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">resp</span> <span class="ruby-comment cmt"># done</span>
          <span class="ruby-keyword kw">when</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTPRedirection</span><span class="ruby-operator">:</span>   <span class="ruby-identifier">url</span> = <span class="ruby-identifier">resp</span>[<span class="ruby-value str">'location'</span>]
          <span class="ruby-keyword kw">else</span>                         <span class="ruby-identifier">resp</span>.<span class="ruby-identifier">error!</span> <span class="ruby-comment cmt"># can be rescued by caller</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># we have a redirect for sure</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">uri</span>.<span class="ruby-identifier">path</span>.<span class="ruby-identifier">match</span>( <span class="ruby-regexp re">/unavailable.html/</span> )
          <span class="ruby-identifier">raise</span> <span class="ruby-constant">TransportError</span>, <span class="ruby-value str">&quot;Server Unavailable: Try again Later&quot;</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># loop to follow the redirect</span>
      <span class="ruby-keyword kw">end</span>
      <span class="ruby-identifier">raise</span> <span class="ruby-constant">TransportError</span>, <span class="ruby-value str">&quot;HTTP::Too many HTTP redirects&quot;</span>
    <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>


    </div>


  </div>


<div id="validator-badges">

<p><small>

  Copyright 2006 Google Inc.  Licensed under the 
  <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank"
  >Apache License, Version 2.0</a> (the "License").

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  License for the specific language governing permissions and limitations under
  the License.

</small></p>
</div>

</body>
</html>